home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / ts.h.z / ts.h
Text File  |  1992-04-03  |  10KB  |  315 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1986, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12.  
  13. #ident    "$Revision: 1.3 $"
  14.  
  15. /*
  16. ** ts.h
  17. **   The file contains the various defines and structures for the
  18. **   QIC-02 (ISI) tape controller.
  19. */
  20.  
  21. /*
  22. ** Types of wait that can used with the tscmd() routine
  23. */
  24. typedef enum
  25. {
  26.     TS_WAIT,    TS_NOWAIT,    TS_POLL
  27. } tswtype;
  28.  
  29. /*
  30. ** pass or fail return values for tsiomove() and ts_ssrdelay()
  31. */
  32. typedef enum
  33. {
  34.     TS_PASS,    TS_FAIL
  35. } tscc;
  36.  
  37. /*
  38. ** Layout of the Controller registers
  39. */
  40. typedef volatile struct
  41. {
  42.     ushort    tsr_tcpr;    /* Command pointer register: w only        */
  43.     ushort    tsr_txcpr;    /* Extended command pointer register: w only*/
  44.     ushort    tsr_clkreg;    /* Clock register: r/w                */
  45.     ushort    tsr_atxcpr;    /* Alternate extended command pointer        */
  46.                 /*   register: w                */
  47. } *tsregs;
  48.  
  49. /*
  50. ** this define remaps the tsr_tcpr, Command Pointer register into correct
  51. ** name for the same location when read
  52. */
  53. #define    tsr_tssr    tsr_txcpr    /* Status register: r only */
  54.  
  55. /*
  56. ** Layout of the command packet
  57. */
  58. typedef struct
  59. {
  60.     ushort    tscp_cmd;        /* command bits            */
  61.     ushort    tscp_badr_lo;        /* low order buffer address    */
  62.     ushort    tscp_badr_hi;        /* high order buffer address    */
  63.     ushort    tscp_cnt;        /* count            */
  64. } tscmdpkt;
  65.  
  66. /*
  67. ** Layout of Message packet
  68. */
  69. typedef struct
  70. {
  71.     ushort    tsmp_type;    /* Message type info            */
  72.     ushort    tsmp_len;    /* Length of message packet        */
  73.     ushort    tsmp_rbpcr;    /* Residual count            */
  74.     ushort    tsmp_xs0;    /* Extended status register #0        */
  75.     ushort    tsmp_xs1;    /* Extended status register #1        */
  76.     ushort    tsmp_xs2;    /* Extended status register #2 (zero)    */
  77.     ushort    tsmp_xs3;    /* Extended status register #3        */
  78.     ushort    tsmp_pad;
  79. } tsmsgpkt;
  80.  
  81. typedef struct
  82. {
  83.     ushort    tsrp_badr_lo;        /* low address of message packet  */
  84.     ushort    tsrp_badr_hi;        /* high address of message packet */
  85.     ushort    tsrp_cnt;        /* byte size of message packet    */
  86.     ushort    tsrp_modes;        /* characteristic info          */
  87. } tscrpkt;
  88.  
  89. typedef volatile tscmdpkt    *tscmdpkt_ptr;
  90. typedef volatile tsmsgpkt    *tsmsgpkt_ptr;
  91. typedef volatile tscrpkt    *tscrpkt_ptr;
  92.  
  93. /*
  94. ** This structure contains the info pertenanit to the controller
  95. */
  96. typedef struct
  97. {
  98.     /* pointer to cmd packet - uncached  */
  99.     tscmdpkt_ptr    tsc_cmdpkt_nc;
  100.  
  101.     /* pointer to msg packet - uncached  */
  102.     tsmsgpkt_ptr    tsc_msgpkt_nc;
  103.  
  104.     /* pointer to characteristics packet - un-cached */
  105.     tscrpkt_ptr    tsc_crpkt_nc;
  106.  
  107.     tscmdpkt    tsc_cmdpkt;    /* cmd packet                 */
  108.     tsmsgpkt    tsc_msgpkt;    /* msg packet                 */
  109.     tscrpkt        tsc_crpkt;    /* characteristics packet         */
  110.  
  111.     tsregs        tsc_tsregs;    /* pointer to controller registers   */
  112.     char        *tsc_buffer;    /* pointer to internal buffer         */
  113.  
  114.     int        tsc_dtime;    /* delay time                 */
  115.     int        tsc_dinterval;    /* delay interval             */
  116.     lock_t        tsc_splock;    /* spin lock for exclusive use         */
  117.     sema_t        tsc_iodone;    /* sleep/wakeup semaphore         */
  118.  
  119.     /*
  120.     ** semaphore used to insure that one processor has exclusive use
  121.     ** during reads, writes and ioctls.  This is done to keep the state 
  122.     ** info consistent because a user could do an open followed
  123.     ** by a fork.
  124.     */
  125.     sema_t        tsc_mine;
  126.  
  127.     int        (*tsc_iomove)();/* pointer to which iomove to use    */
  128.     ushort        tsc_state;    /* state of the device             */
  129. } tscinfo;
  130.  
  131. /*
  132. ** States for the device
  133. */
  134. #define    TSCS_OPEN    0x01    /* device is opened or open in progress    */
  135. #define    TSCS_PROBED    0x02    /* device has been probed and found    */
  136. #define    TSCS_INITED    0x04    /* device has been initialized, if not    */
  137.                 /*  set implies intr occurred which lost*/
  138.                 /*  tape position            */
  139. #define    TSCS_EOT    0x08    /* device has encountered EOT        */
  140. #define    TSCS_FM        0x10    /* device has encountered file mark    */
  141. #define    TSCS_READ    0x20    /* device opened for reading        */
  142. #define    TSCS_WRITE    0x40    /* device opened for writting        */
  143. #define    TSCS_REWIND    0x80    /* device is being rewound        */
  144. #define    TSCS_OFFL    0x100    /* device is off-line            */
  145. #define    TSCS_ERROR    0x8000    /* device had an error            */
  146.  
  147. /*
  148. ** Valid Commands defined
  149. */
  150. #define    TS_POS_FSF_BITS    0x0200        /* mode bits for position cmd    */
  151.                     /*  for file space forward    */
  152. #define    TS_POS_FSR_BITS    0x0000        /* mode bits for position cmd    */
  153.                     /*  for file space reverse    */
  154. #define    TS_POS_REW_BITS    0x0400        /* mode bits for position cmd    */
  155.                     /* for rewind            */
  156.  
  157. #define    TS_NOP_CMD    0x0000        /* nop - pseudo-cmd        */
  158. #define    TS_POS_CMD    0x0008        /* position            */
  159. #define    TS_READ_CMD    0x0001        /* read data            */
  160. #define    TS_WRITECR_CMD    0x0004        /* write characteristics    */
  161. #define    TS_WRITE_CMD    0x0005        /* write data            */
  162.  
  163. /* forward space file        */
  164. #define    TS_FSF_CMD    (TS_POS_CMD | TS_POS_FSF_BITS)
  165.  
  166. /* forward space record        */
  167. #define    TS_FSR_CMD    (TS_POS_CMD | TS_POS_FSR_BITS)
  168.  
  169. /* rewind            */
  170. #define    TS_REWIND_CMD    (TS_POS_CMD | TS_POS_REW_BITS)
  171.  
  172. #define    TS_FORMAT_CMD    0x0009        /* format - write file mark    */
  173. #define    TS_RETEN_CMD    0x000B        /* retension command        */
  174. #define    TS_GETST_CMD    0x000F        /* get status            */
  175. #define    TS_CMD_MSK    0x0F1F        /* bits that commands use    */
  176.  
  177. /*
  178. ** Associated command bits in the command packet
  179. */
  180. #define    TSCMD_ACK_BIT    0x8000        /* ack - release command packet    */
  181. #define    TSCMD_1_BIT    0x4000        /* must be one            */
  182. #define TSCMD_SWB_BIT_    0x1000        /* don't swap bytes (active low)*/
  183. #define    TSCMD_IE_BIT    0x0080        /* interrupt enable        */
  184.  
  185. /*
  186. ** Associated command bits in the message packet
  187. */
  188. #define    TSMSG_ACK_BIT    0x8000        /* ack - if set cpu owns packet    */
  189.  
  190. /*
  191. ** Bits in the tssr status register
  192. */
  193. #define    TSSR_SC        0x8000        /* special condition (error)     */
  194. #define    TSSR_RMR    0x1000        /* register modification refused */
  195. #define    TSSR_NXM    0x0800        /* nonexistant memory         */
  196. #define    TSSR_NBA    0x0400        /* need buffer address         */
  197. #define    TSSR_SSR    0x0080        /* subsytem ready         */
  198. #define    TSSR_OFL    0x0040        /* off-line             */
  199.  
  200. /* termination codes */
  201. #define    TSSR_TC_MSK    0x000E        /* termination codes         */
  202. #define    TC_OK        0x0000    /* TC0: normal termination         */
  203. #define    TC_ATTN        0x0002    /* TC1: attention             */
  204. #define    TC_ALERT    0x0004    /* TC2: tape status alert         */
  205. #define    TC_REJECT    0x0006    /* TC3: function reject             */
  206. #define    TC_UNREC0    0x0008    /* TC4: unrecoverable, tape position lost*/
  207. #define    TC_UNREC1    0x000A    /* TC5: unrecoverable, tape position lost*/
  208. #define    TC_UNREC2    0x000C    /* TC6: unrecoverable, tape position lost*/
  209. #define    TC_FATAL    0x000E    /* TC7: fatal error             */
  210.  
  211. /*
  212. ** Bits in the txcpr register
  213. */
  214. #define    TXCPR_INIT    0x8000    /* subsystem clear    */
  215.  
  216. /*
  217. ** Bits in extended status register 0 (XS0)
  218. */
  219. #define    XS0_TMK    0x8000        /* tape mark detected        */
  220. #define    XS0_RLS    0x4000        /* record length short        */
  221. #define    XS0_LET    0x2000        /* logical end of tape        */
  222. #define    XS0_RLL    0x1000        /* record length long        */
  223. #define    XS0_WLE    0x0800        /* write lock error        */
  224. #define    XS0_NEF    0x0400        /* non-executable function    */
  225. #define    XS0_ILC    0x0200        /* illegal command        */
  226. #define    XS0_ILA    0x0100        /* illegal address        */
  227. #define    XS0_ONL    0x0040        /* on-line            */
  228. #define    XS0_IE    0x0020        /* interrupt enable status    */
  229. #define    XS0_WLK    0x0004        /* write locked            */
  230. #define    XS0_BOT    0x0002        /* beginning of tape        */
  231. #define    XS0_EOT    0x0001        /* end of tape            */
  232.  
  233. /*
  234. ** Bits in extended status register 1 (XS1)
  235. */
  236. #define    XS1_UNC    0x0002        /* uncorrectable data */
  237.  
  238. /*
  239. ** Bits in extended status register 3 (XS3)
  240. */
  241. #define    XS3_REV    0x0020        /* tape motion is reverse    */
  242. #define    XS3_RIB    0x0001        /* reverse into BOT        */
  243.  
  244. /*
  245. ** Bits in the characteristics mode word
  246. */
  247. #define    CR_ESS    0x0080        /* enable skip tape marks stop        */
  248. #define    CR_ENB    0x0040        /* enable tape mark stop off BOT    */
  249. #define    CR_RAW    0x0008        /* enable non-block mode        */
  250. #define    CR_Q11    0x0004        /* use qic-11 mode            */
  251. #define    CR_FMT    0x0002        /* enable format            */
  252.  
  253. /*
  254. ** Delay times for waiting for the sub-system to come ready
  255. ** The init delay is calculated for the longest tape (600ft); this is
  256. ** because an init also causes a rewind, which we must wait to complete.
  257. ** Rewind speed: 90ips
  258. **    The formula used is:
  259. **        1/90 * ( tape length ft * ( 12 inches per sec ) )
  260. */
  261. #define    DELAY_FUDGE    10    /* fudge factor for delays    */
  262. #define    NO_DELAY    0
  263. #define    NO_INTERVAL     0
  264.  
  265. /*
  266. ** For an INIT delay we use the max time for a 600 foot tape
  267. ** and add in a FUDGE factor. For an INIT interval we use 1/6 the time
  268. ** for a 150 foot tape.
  269. */
  270. #define    INIT_DELAY    ((HZ * 80) + DELAY_FUDGE)
  271. #define    INIT_INTERVAL     ((HZ * 3) + DELAY_FUDGE)
  272.  
  273. /*
  274. ** For the spacing commands, the controller can handle on a ushort amount
  275. ** at a time
  276. */
  277. #define    MAX_POSITION_AMT    16384
  278.  
  279. #define    TS_MINXFER_SZ        512    /* minumum xfer size    */
  280.  
  281. /*
  282. ** Maximum xfer size.  This is the maximum the driver will support via
  283. ** its internal buffer.  The controller will acually support a
  284. ** 64kb xfer
  285. */
  286. #define    TS_MAXXFER_SZ        4096
  287.  
  288. /*
  289. ** Masks for the various bits the minor device is composed of
  290. */
  291. #define    CNTRLR_MSK    0x0f    /* mask for controller bits         */
  292. #define    REWIND_MSK    0x10    /* mask for rewind/no rewind bits    */
  293. #define    SWAP_MSK    0x20    /* mask for swap bytes bit        */
  294.  
  295. /*
  296. ** Macros for various bits of the minor device
  297. */
  298. #define    CNTRLR_DEV(dev)        ((dev) & CNTRLR_MSK)
  299. #define    ISREWIND_DEV(dev)    (((dev) & REWIND_MSK) == 0)
  300. #define    ISSWAP_DEV(dev)        ((dev) & SWAP_MSK)
  301.  
  302. #ifdef    _KERNEL
  303.  
  304. tscc    tsiomove();
  305. tscc    ts_ssr();
  306. void    ts_timeout();
  307. void    tsreset();
  308. void    tswrcr();
  309. void    tsgetst();
  310. void    tsretension();
  311. void    tsformat();
  312. void    tsio();
  313.  
  314. #endif
  315.